// main.js
const fs = require('fs');
const path = require('path');
const { initApp, closeApp } = require('./utils/appUtils');
const { app, BrowserWindow, ipcMain, globalShortcut } = require('electron');
const NODE_ENV = process.env.NODE_ENV;

function createWindow() {
    // 创建浏览器窗口
    const mainWindow = new BrowserWindow({
        width: 1200,
        height: 800,
        webPreferences: {
            contextIsolation: true,
            enableRemoteModule: false,
            preload: path.join(__dirname, 'preload.js'),
            contentSecurityPolicy:
                "default-src 'self'; img-src 'self' data: blob: http://localhost:*; style-src 'self' 'unsafe-inline';connect-src 'self' http://localhost:* ws://localhost:*;"
        }
    });

    // 默认最大化窗口
    mainWindow.maximize();

    // 加载渲染进程页面
    // mainWindow.loadURL(NODE_ENV === 'development' ? 'http://localhost:5173' : `file://${path.join(__dirname, '../../dist/index.html')}`);
    const url = NODE_ENV === 'development' ? `http://localhost:5173/?windowType=main` : `file://${path.join(__dirname, '../../dist/index.html')}?windowType=main`;
    mainWindow.loadURL(url);

    // 设置不显示默认菜单
    mainWindow.setMenu(null);

    // 设置窗口大小调整后的处理逻辑
    mainWindow.on('resize', () => {});

    // 打开开发工具
    // if (NODE_ENV === 'development') {
    //     mainWindow.webContents.openDevTools();
    // }

    // 注册全局快捷键，手工捕获单张截图
    globalShortcut.register('CommandOrControl+Shift+C', () => {
        console.log('Ctrl+Shit+C pressed');
        app.server.broadcast(
            JSON.stringify({
                event: 'capture',
                data: ''
            })
        );
    });

    // 全局快捷键，自动化捕获滚动页面的截图
    globalShortcut.register('CommandOrControl+Shift+M', () => {
        console.log('Ctrl+Shift+M pressed');
        app.server.broadcast(
            JSON.stringify({
                event: 'drag',
                data: {
                    mode: 'manual'
                }
            })
        );
    });

    // 注册全局快捷键：Ctrl+D 打开调试工具
    globalShortcut.register('CommandOrControl+Shift+D', () => {
        const windows = BrowserWindow.getAllWindows();
        windows.forEach((win) => {
            win.webContents.toggleDevTools();
        });
    });
}

// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
app.whenReady().then(async () => {
    await initApp(app);
    registerIpcHandlers();
    createWindow();

    app.on('activate', async function () {
        // 通常在 macOS 上，当点击 dock 中的应用程序图标时，如果没有其他
        // 打开的窗口，那么程序会重新创建一个窗口。
        if (BrowserWindow.getAllWindows().length === 0) createWindow();
        await initApp(app);
    });
});

app.on('before-quit', async (event) => {
    console.log('Before-Quit.');
});

app.on('will-quit', async (event) => {
    console.log('Will-Quit.');
    globalShortcut.unregisterAll();

    event.preventDefault();
    try {
        // 关闭数据库和本地server
        await closeApp(app);
        // 执行完所有清理操作后，再退出应用程序
        app.exit(0);
    } catch (e) {
        console.error('Error occurred during app quit:', e);
        app.exit(1);
    }
});

// 除了 macOS 外，当所有窗口都被关闭的时候退出程序。 因此，通常对程序和它们在
// 任务栏上的图标来说，应当保持活跃状态，直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', async function () {
    console.log('Windows All Closed.');
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

///////////////////////////////////////////////////////////////////////////
// 定义ipc处理的消息类型
function registerIpcHandlers() {
    const handlersPath = path.join(__dirname, 'ipcHandlers');
    const topLevelDirs = fs.readdirSync(handlersPath);

    topLevelDirs.forEach((topLevelDir) => {
        const topLevelDirPath = path.join(handlersPath, topLevelDir);
        if (fs.statSync(topLevelDirPath).isDirectory()) {
            const handlerFiles = fs.readdirSync(topLevelDirPath);
            handlerFiles.forEach((file) => {
                if (file.endsWith('.js')) {
                    const handlerClass = require(path.join(topLevelDirPath, file));
                    const handler = new handlerClass(app);
                    const eventName = `${topLevelDir}/${path.basename(file, '.js')}`;
                    // console.log(`Register Event [${eventName}]`);
                    ipcMain.handle(eventName, handler.handle.bind(handler));
                }
            });
        }
    });
}
